#ifndef __HF_HAL_GPIO_H__
#define __HF_HAL_GPIO_H__

#include "hf_hal_common.h"

// 错误码
#define GPIO_OK                 0
#define GPIO_ERROR              1

// GPIO 模式枚举
typedef enum {
    HF_GPIO_MODE_INPUT = 0,        // 输入模式
    HF_GPIO_MODE_OUTPUT,           // 推挽输出
    HF_GPIO_MODE_AF,               // 复用功能
    HF_GPIO_MODE_ANALOG,           // 模拟模式
    HF_GPIO_MODE_OUTPUT_OD         // 开漏输出
} hf_gpio_mode_e;

// GPIO 上拉/下拉枚举
typedef enum {
    HF_GPIO_PUPD_NOPULL = 0,       // 无上拉/下拉
    HF_GPIO_PUPD_UP,               // 上拉
    HF_GPIO_PUPD_DOWN              // 下拉
} hf_gpio_pupd_e;

// GPIO 速度枚举
typedef enum {
    HF_GPIO_SPEED_LOW = 0,         // 2MHz
    HF_GPIO_SPEED_MEDIUM,          // 25MHz
    HF_GPIO_SPEED_HIGH,            // 50MHz
    HF_GPIO_SPEED_VERY_HIGH        // 100MHz
} hf_gpio_speed_e;

// 中断触发类型枚举
typedef enum {
    HF_GPIO_IRQ_TRIGGER_RISING = 0,  // 上升沿触发
    HF_GPIO_IRQ_TRIGGER_FALLING,     // 下降沿触发
    HF_GPIO_IRQ_TRIGGER_BOTH         // 双边沿触发
} hf_gpio_irq_trigger_t;

// GPIO 配置结构体
typedef struct {
    GPIO_TypeDef *port;            // GPIO 端口 (GPIOA, GPIOB, ...)
    uint16_t pin;                  // GPIO 引脚 (GPIO_Pin_0, GPIO_Pin_1, ...)
    hf_gpio_mode_t mode;           // GPIO 模式
    hf_gpio_pupd_t pupd;           // 上拉/下拉
    hf_gpio_speed_t speed;         // 输出速度
    uint8_t af;                    // 复用功能 (GPIO_AF_I2C1, GPIO_AF_SPI1, ...)
} hf_gpio_config_t;

// GPIO 中断配置结构体
typedef struct {
    GPIO_TypeDef *port;            // 中断引脚端口
    uint16_t pin;                  // 中断引脚
    uint8_t exti_line;             // EXTI 线号 (EXTI_Line0, EXTI_Line1, ...)
    hf_gpio_irq_trigger_t trigger;  // 中断触发类型
    uint8_t priority;              // 中断优先级 (0-15)
} hf_gpio_irq_config_t;

/**
 * @brief  初始化 GPIO
 * @param  config: GPIO 配置结构体指针
 * @retval GPIO状态 (GPIO_OK 或 GPIO_ERROR)
 */
int8_t hf_gpio_init(const hf_gpio_config_t *config);

/**
 * @brief  写 GPIO 引脚电平
 * @param  port: GPIO 端口
 * @param  pin: GPIO 引脚
 * @param  state: 电平状态 (0 或 1)
 * @retval GPIO状态
 */
int8_t hf_gpio_write(GPIO_TypeDef *port, uint16_t pin, uint8_t state);

/**
 * @brief  读 GPIO 引脚电平
 * @param  port: GPIO 端口
 * @param  pin: GPIO 引脚
 * @retval 引脚电平 (0 或 1) 或 GPIO_ERROR
 */
int8_t hf_gpio_read(GPIO_TypeDef *port, uint16_t pin);

/**
 * @brief  翻转 GPIO 引脚电平
 * @param  port: GPIO 端口
 * @param  pin: GPIO 引脚
 * @retval GPIO状态
 */
int8_t hf_gpio_toggle(GPIO_TypeDef *port, uint16_t pin);

/**
 * @brief  配置 GPIO 中断
 * @param  config: 中断配置结构体指针
 * @retval GPIO状态
 */
int8_t hf_gpio_init_irq(const hf_gpio_irq_config_t *config);

/**
 * @brief  中断服务处理（内部调用）
 * @param  exti_line: EXTI 线号
 * @retval None
 */
void hf_gpio_handle_irq(uint32_t exti_line);

#endif /* __HF_HAL_GPIO_H__ */